'''
支付宝支付
'''

from alipay import AliPay

from django.conf import settings

from .wechatpay_handler import payment_success


# 初始化支付对象
def initialize_alipay():
    alipay = AliPay(
        appid=settings.ALI_PAY_CONFIG['AppId'],
        app_notify_url=settings.ALI_PAY_CONFIG['NotifyURL'],  # 默认回调url
        app_private_key_string=open(settings.ALI_PAY_CONFIG['PrivateKey']).read(),
        alipay_public_key_string=open(settings.ALI_PAY_CONFIG['PublicKey']).read(),
        # sign_type="RSA2",
        # debug=True  # 默认False
    )

    return alipay


def alipay_precreate(totalfee, orderno, subjectmes):
    '''
    主函数
    '''

    # 初始化
    alipay = initialize_alipay()

    result=alipay.api_alipay_trade_precreate(
        subject=subjectmes,
        out_trade_no=orderno,
        total_amount=float(totalfee)
    )

    # print('返回值',result)
    code_url = result.get('qr_code')

    if code_url:
        res_mes = {
            'code': 200,
            'message': code_url
        }
    else:
        res_mes = {
            'code': 400,
            'message': code_url
        }


    return res_mes


def alipay_notify(notify_data):
    '''
    支付宝支付 回调通知地址
    '''
    # 初始化
    # print(notify_data, "返回的数据")
    response_dict = {}

    alipay = initialize_alipay()

    signature = notify_data.pop("sign")

    # verification
    success = alipay.verify(notify_data, signature)
    if success and notify_data["trade_status"] in ("TRADE_SUCCESS", "TRADE_FINISHED" ):
        # 在这里回调接口，支付宝那边已经显示 支付成功了
        # 为了保险起见，我们再次调用一次 订单查询接口，查看是否支付成功
        # 查询订单号
        out_trade_no = notify_data['out_trade_no']

        # 查询订单状态
        chaeck_trade_res = chaeck_alipay_trade(out_trade_no)

        if chaeck_trade_res:
            return {'code': 'FAILED', 'message': '失败'}
        
        # 异步通知回调公共逻辑
        # 就是修改一些数据库的信息，比如订单表，日志表，充值表
        res = payment_success(out_trade_no)

        if res:
            response_dict = {'code': 'FAILED', 'message': '失败'}
        response_dict = {'code': 'SUCCESS', 'message': '成功'}
    else:
        response_dict = {'code': 'FAILED', 'message': '失败'}

    return response_dict


def chaeck_alipay_trade(out_trade_no):
    '''
    查询订单状态
    '''
    mes = ""

    # verification
    alipay = initialize_alipay()

    # 查询订单状态
    chaeck_trade_res = alipay.api_alipay_trade_query(out_trade_no)

    if chaeck_trade_res['code'] == '10000':
        if chaeck_trade_res['trade_status'] == 'TRADE_SUCCESS':
            return mes
        else:
            mes = "error"
            return mes
    else:
        mes = "error"
        return mes

